package datasource

import (
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
	log "github.com/micro/go-micro/v2/logger"
	"rpc-service/product/config"
	"rpc-service/product/config/global"
	"time"
)

//管理多库连接,读写分离或多库,微服务中不建议连接多个库，如果需要的话可以在这里扩展
type DBManager struct {
	master *gorm.DB //主库
	slave  *gorm.DB //从库，读库
}

var dbManager DBManager

func InitDatabase() {
	config := global.AppConfig
	dbManager.master = NewMysqlEngine(config.DBMaster)
	//从库是可选项,如果配置了从库,则需要连接
	if len(config.DBSlave.DataSourceName) > 0 {
		dbManager.slave = NewMysqlEngine(config.DBSlave)
	}
}

func GetDB() *gorm.DB {
	return dbManager.master
}

func GetDBSlave() *gorm.DB {
	return dbManager.slave
}

/**
 * 实例化数据库引擎方法：mysql的数据引擎
 */
func NewMysqlEngine(database config.DataBase) *gorm.DB {
	//db, err := gorm.Open("mysql", "user:password@(host)/dbname?charset=utf8&parseTime=True&loc=Local")
	if db, err := gorm.Open("mysql", database.DataSourceName); err != nil {
		log.Fatal("连接数据库失败:"+database.DataSourceName, err)
		panic(err)
	} else {
		// 表名使用单数
		db.SingularTable(true)
		db.LogMode(true)
		db.DB().SetMaxIdleConns(int(database.MaxIdleConns))
		db.DB().SetMaxOpenConns(int(database.MaxOpenConns))
		db.DB().SetConnMaxLifetime(10 * time.Second)
		log.Info("连接数据库成功:" + database.DataSourceName)
		return db
	}
}
